package demo2;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 姚东名
 * Date: 2024-06-21
 * Time: 10:39
 */

public class SystemUtil {
    public static boolean isAdmin(String userId) {
        return userId.toLowerCase() == "admin";
    }

    public static void main1(String[] args) {
        System.out.println(isAdmin("Admin"));
    }

    public static void main(String[] args) {
        String s1 = "abc" + "def";
        String s2 = new String(s1);
        if (s1.equals(s2))
            System.out.println(".equals succeeded");
        if (s1 == s2)
            System.out.println("==succeeded");
    }
}

/*
执行结果：
false
 */

/*
这段代码会输出 false。

原因分析：

isAdmin 方法接受一个 userId 字符串参数，并将其转换为小写。
然后，它尝试通过 == 运算符来比较转换后的小写字符串是否等于 "admin"。
在 Java 中，使用 == 运算符比较字符串对象时，实际上是在比较对象的引用，而不是内容。因此，即使两个字符串的内容相同，如果它们不是同一个对象，== 运算符也会返回 false。
在 isAdmin 方法中，"admin" 是一个字符串字面量，它在字符串常量池中创建一个对象。而 userId.toLowerCase() 创建了一个新的字符串对象（即使内容相同），这个新对象与字符串常量池中的 "admin" 对象不是同一个对象。
因此，userId.toLowerCase() == "admin" 的结果为 false。
在 main 方法中，调用 isAdmin("Admin") 会传入字符串 "Admin"，然后转换为小写并与 "admin" 进行比较。由于上述原因，比较结果为 false，所以输出也是 false。

 */

/*
这段代码会输出：

.equals succeeded
简短分析如下：

String s1="abc"+"def"; 这一行会创建一个字符串字面量 "abcdef" 并将其引用赋值给 s1。由于字符串拼接在编译时发生，s1 实际上直接引用了拼接后的字符串 "abcdef"。
String s2=new String(s1); 这一行通过 new 关键字创建了一个新的 String 对象，其内容复制自 s1。即使内容相同，s2 引用的是堆上新创建的对象，而不是字符串常量池中的对象。
if(s1.equals(s2)) 使用 .equals() 方法比较 s1 和 s2 的内容是否相同。由于两个字符串的内容都是 "abcdef"，所以 .equals() 方法返回 true，因此会执行并输出 ".equals succeeded"。
if(s1==s2) 使用 == 操作符比较 s1 和 s2 的引用是否相同。由于 s1 引用的是字符串常量池中的对象，而 s2 引用的是堆上的新对象，两者的引用不同，所以 s1 == s2 的结果为 false，因此不会输出 "==succeeded"。
 */